/**
 *  数据字典与映射对象的相互之间的转换方法
 * @module utils/dictionary
 * @author 顾章华
 */

/**
 * 数组转换成映射对象
 * @param {Object[]} array 要转换的数组
 * @param {string} label 健名称
 * @param {string} value 值名称
 * @return {Object}
 */
export function arrayToMap(array = [], label = 'label', value = 'value') {
  // 创建一个空的对象
  let map = Object.create(null);
  array.forEach((item) => {
    map[item[label]] = item[value];
  });
  return map;
}

/**
 * 映射对象转换成数组
 * @param {Object} map 要转换的映射对象
 * @param {string} label 健名称
 * @param {string} value 值名称
 * @return {Object[]}
 */
export function mapToArray(map, label = 'label', value = 'value') {
  return Object.keys(map).map((key) => {
    return {
      [label]: key,
      [value]: map[key]
    };
  });
}

/**
 * tree结构的数据转换成数组
 * @param {Array}  tree数据
 * @param {String} 下一级的键名称
 * @param {Array}  默认数组
 * @return: {Array}
 */
export const treeToArray = (tree, children = 'children', initArray = []) => {
  tree = Array.isArray(tree) ? tree : [tree];
  return tree.reduce(
    (function reduceChildren(array, item) {
      array.push({
        ...item
      });
      if (item[children] && item[children].length) {
        item[children].reduce(reduceChildren, array);
      }
      return array
    }),
    initArray
  );
};
